Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
53.85% |
7 / 13 |
CRAP | |
59.57% |
28 / 47 |
| UploadedImageSubscriber | |
0.00% |
0 / 1 |
|
53.85% |
7 / 13 |
62.05 | |
59.57% |
28 / 47 |
| __construct | |
0.00% |
0 / 1 |
2.06 | |
75.00% |
3 / 4 |
|||
| getSubscribedEvents | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| postRemove | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| preUpdate | |
0.00% |
0 / 1 |
3.37 | |
30.00% |
3 / 10 |
|||
| prePersist | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| postPersist | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| postUpdate | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| handleImageUpload | |
0.00% |
0 / 1 |
6.00 | |
50.00% |
5 / 10 |
|||
| updateImageName | |
0.00% |
0 / 1 |
2.26 | |
60.00% |
3 / 5 |
|||
| getUploadRootDir | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 1 |
|||
| removeImage | |
0.00% |
0 / 1 |
10.40 | |
40.00% |
2 / 5 |
|||
| hasUploadedImage | |
100.00% |
1 / 1 |
2 | |
100.00% |
1 / 1 |
|||
| isExpectedEntity | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| <?php | |
| namespace Akeneo\UserManagement\Bundle\EventListener; | |
| use Akeneo\UserManagement\Component\EntityUploadedImageInterface; | |
| use Doctrine\Common\EventSubscriber; | |
| use Doctrine\ORM\Event\LifecycleEventArgs; | |
| class UploadedImageSubscriber implements EventSubscriber | |
| { | |
| /** | |
| * @var string | |
| */ | |
| protected $webRoot; | |
| /** | |
| * Define web root path. | |
| * | |
| * @param string $kernelRootDir | |
| * @throws \InvalidArgumentException | |
| */ | |
| public function __construct($kernelRootDir) | |
| { | |
| $this->webRoot = realpath($kernelRootDir . '/../web'); | |
| if (!$this->webRoot) { | |
| throw new \InvalidArgumentException('Invalid kernel root'); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getSubscribedEvents() | |
| { | |
| return [ | |
| 'preUpdate', | |
| 'prePersist', | |
| 'postPersist', | |
| 'postUpdate', | |
| 'postRemove' | |
| ]; | |
| } | |
| /** | |
| * Remove uploaded image if any. | |
| * | |
| * @param LifecycleEventArgs $args | |
| */ | |
| public function postRemove(LifecycleEventArgs $args) | |
| { | |
| /** @var EntityUploadedImageInterface $entity */ | |
| $entity = $args->getEntity(); | |
| $this->removeImage($entity); | |
| } | |
| /** | |
| * Handle preUpdate. | |
| * | |
| * @param LifecycleEventArgs $args | |
| */ | |
| public function preUpdate(LifecycleEventArgs $args) | |
| { | |
| /** @var EntityUploadedImageInterface $entity */ | |
| $entity = $args->getEntity(); | |
| if ($this->hasUploadedImage($entity)) { | |
| $this->removeImage($entity); | |
| $this->updateImageName($args); | |
| $em = $args->getEntityManager(); | |
| $uow = $em->getUnitOfWork(); | |
| $uow->recomputeSingleEntityChangeSet( | |
| $em->getClassMetadata(get_class($entity)), | |
| $entity | |
| ); | |
| } | |
| } | |
| /** | |
| * Handle prePersist. | |
| * | |
| * @param LifecycleEventArgs $args | |
| */ | |
| public function prePersist(LifecycleEventArgs $args) | |
| { | |
| $this->updateImageName($args); | |
| } | |
| /** | |
| * Handle postPersist. | |
| * | |
| * @param LifecycleEventArgs $args | |
| */ | |
| public function postPersist(LifecycleEventArgs $args) | |
| { | |
| $this->handleImageUpload($args); | |
| } | |
| /** | |
| * Handle postUpdate. | |
| * | |
| * @param LifecycleEventArgs $args | |
| */ | |
| public function postUpdate(LifecycleEventArgs $args) | |
| { | |
| $this->handleImageUpload($args); | |
| } | |
| /** | |
| * Move uploaded image to upload dir. | |
| * | |
| * @param LifecycleEventArgs $args | |
| */ | |
| protected function handleImageUpload(LifecycleEventArgs $args) | |
| { | |
| $entity = $args->getEntity(); | |
| if ($this->isExpectedEntity($entity)) { | |
| if (!$this->hasUploadedImage($entity)) { | |
| return; | |
| } | |
| $dir = $this->getUploadRootDir($entity); | |
| if (!file_exists($dir)) { | |
| mkdir($dir, 0755, true); | |
| } | |
| $entity->getImageFile()->move($dir, $entity->getImage()); | |
| $entity->unsetImageFile(); | |
| } | |
| } | |
| /** | |
| * Update uploaded image name. | |
| * | |
| * @param LifecycleEventArgs $args | |
| */ | |
| protected function updateImageName(LifecycleEventArgs $args) | |
| { | |
| /** @var EntityUploadedImageInterface $entity */ | |
| $entity = $args->getEntity(); | |
| if ($this->hasUploadedImage($entity)) { | |
| $filename = sha1(uniqid(mt_rand(), true)); | |
| $entity->setImage($filename . '.' . $entity->getImageFile()->guessExtension()); | |
| } | |
| } | |
| /** | |
| * Get upload directory location in FS. | |
| * | |
| * @param EntityUploadedImageInterface $entity | |
| * @return string | |
| */ | |
| protected function getUploadRootDir(EntityUploadedImageInterface $entity) | |
| { | |
| return rtrim($this->webRoot, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $entity->getUploadDir(); | |
| } | |
| /** | |
| * Remove image. | |
| * | |
| * @param EntityUploadedImageInterface $entity | |
| */ | |
| protected function removeImage($entity) | |
| { | |
| if ($this->isExpectedEntity($entity) && $entity->getImage()) { | |
| $file = $this->getUploadRootDir($entity) . DIRECTORY_SEPARATOR . $entity->getImage(); | |
| if (is_file($file) && is_writable($file)) { | |
| unlink($file); | |
| } | |
| } | |
| } | |
| /** | |
| * Check for new image upload. | |
| * | |
| * @param EntityUploadedImageInterface $entity | |
| * @return bool | |
| */ | |
| protected function hasUploadedImage($entity) | |
| { | |
| return $this->isExpectedEntity($entity) && null !== $entity->getImageFile(); | |
| } | |
| /** | |
| * Check if entity acceptable by subscriber. | |
| * | |
| * @param object $entity | |
| * @return bool | |
| */ | |
| protected function isExpectedEntity($entity) | |
| { | |
| return $entity instanceof EntityUploadedImageInterface; | |
| } | |
| } |